home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
cocktail
/
cg.lha
/
cg
/
src
/
Scanner.mi
< prev
next >
Wrap
Text File
|
1992-11-24
|
40KB
|
1,575 lines
(* $Id: Scanner.mi,v 2.11 1992/09/24 13:14:00 grosch rel $ *)
IMPLEMENTATION MODULE Scanner;
IMPORT SYSTEM, Checks, System, General, Positions, IO, DynArray, Strings, Source;
(* line 26 "cg.rex" *)
FROM SYSTEM IMPORT ADR;
FROM System IMPORT GetArgument;
FROM StringMem IMPORT PutString;
FROM Strings IMPORT tString, Concatenate, Char, SubString, ArrayToString,
StringToInt, AssignEmpty, Length;
FROM Idents IMPORT MakeIdent, NoIdent, GetStringRef;
FROM Texts IMPORT MakeText, Append;
FROM Tree IMPORT Options, ErrorCount, SourceFile;
FROM Sets IMPORT IsElement;
FROM Positions IMPORT tPosition;
IMPORT Errors;
CONST
TokIdentifier = 1;
TokInteger = 2;
TokString = 3;
TokTargetCode = 4;
TokCode = 5;
TokWhiteSpace = 7;
TokAfter = 24;
TokBefore = 25;
TokBegin = 10;
TokCheck = 26;
TokClose = 11;
TokDeclare = 12;
TokDemand = 28;
TokEnd = 13;
TokEval = 14;
TokExport = 15;
TokFor = 71;
TokFunction = 6;
TokGlobal = 16;
TokIgnore = 72;
TokImport = 30;
TokInherited = 34;
TokInput = 31;
TokLeft = 37;
TokLocal = 18;
TokModule = 19;
TokNone = 39;
TokOutput = 32;
TokParser = 35;
TokPrec = 36;
TokProperty = 70;
TokRemote = 76;
TokReverse = 21;
TokRight = 38;
TokRule = 22;
TokScanner = 77;
TokSelect = 74;
TokStack = 20;
TokSubunit = 75;
TokSynthesized = 33;
TokThread = 27;
TokTree = 23;
TokView = 78;
TokVirtual = 17;
TokLParent = 40; (* '(' *)
TokRParent = 41; (* ')' *)
TokLBracket = 42; (* '[' *)
TokRBracket = 43; (* ']' *)
TokLBrace = 44; (* '{' *)
TokRBrace = 45; (* '}' *)
TokComma = 46; (* ',' *)
TokSemiColon = 47; (* ';' *)
TokDot = 48; (* '.' *)
TokColon = 49; (* ':' *)
TokEqual = 50; (* '=' *)
TokBar = 51; (* '|' *) (* ? *)
TokAssign = 52; (* ':=' *)
TokPlus = 53; (* '+' *) (* ? *)
TokMinus = 54; (* '-' *) (* ? *)
TokAsterisk = 55; (* '*' *) (* ? *)
TokSlash = 56; (* '/' *) (* ? *)
TokLAngle = 57; (* '<' *)
TokRAngle = 58; (* '>' *)
TokRArrow = 59; (* '->' *)
TokCopy = 60; (* ':-' *)
TokArrow = 61; (* '==>' *)
TokLArrow = 62; (* '<-' *)
PROCEDURE ErrorAttribute (Token: CARDINAL; VAR Attribute: tScanAttribute);
BEGIN
WITH Attribute DO
CASE Token OF
| TokIdentifier: Ident := NoIdent;
| TokInteger : Integer := 0;
| TokTargetCode: MakeText (Text);
| TokString
, TokCode
, TokWhiteSpace: StringRef := GetStringRef (NoIdent);
ELSE
END;
END;
END ErrorAttribute;
VAR NestingLevel: INTEGER; Position: tPosition;
CONST
yyTabSpace = 8;
yyDNoState = 0;
yyFileStackSize = 16;
yyInitBufferSize = 1024 * 8 + 256;
yyFirstCh = 0C;
yyLastCh = 177C;
yyEolCh = 12C;
yyEobCh = 177C;
yyDStateCount = 292;
yyTableSize = 3035;
yyEobState = 91;
yyDefaultState = 92;
STD = 1;
comment = 3;
Str1 = 5;
Str2 = 7;
CStr1 = 9;
CStr2 = 11;
targetcode = 13;
expr = 15;
TYPE
yyTableElmt = SHORTCARD;
yyStateRange = yyTableElmt [0 .. yyDStateCount];
yyTableRange = yyTableElmt [0 .. yyTableSize];
yyCombType = RECORD Check, Next: yyStateRange; END;
yyCombTypePtr = POINTER TO yyCombType;
yytChBufferPtr = POINTER TO ARRAY [0 .. 1000000] OF CHAR;
yyChRange = [yyFirstCh .. yyLastCh];
VAR
yyBasePtr : ARRAY yyStateRange OF LONGCARD ;
yyDefault : ARRAY yyStateRange OF yyStateRange ;
yyComb : ARRAY yyTableRange OF yyCombType ;
yyEobTrans : ARRAY yyStateRange OF yyStateRange ;
yyToLower, yyToUpper : ARRAY yyChRange OF CHAR ;
yyStateStack : POINTER TO ARRAY [0 .. 1000000] OF yyStateRange;
yyStateStackSize : LONGINT;
yyStartState : yyStateRange;
yyPreviousStart : yyStateRange;
yyCh : CHAR;
yySourceFile : System.tFile;
yyEof : BOOLEAN;
yyChBufferPtr : yytChBufferPtr;
yyChBufferStart : INTEGER;
yyChBufferSize : LONGINT;
yyChBufferIndex : INTEGER;
yyBytesRead : INTEGER;
yyLineCount : CARDINAL;
yyLineStart : INTEGER;
yyFileStackPtr : SHORTCARD;
yyFileStack : ARRAY [1 .. yyFileStackSize] OF RECORD
SourceFile : System.tFile;
Eof : BOOLEAN;
ChBufferPtr : yytChBufferPtr;
ChBufferStart : INTEGER;
ChBufferSize : LONGINT;
ChBufferIndex : INTEGER;
BytesRead : INTEGER;
LineCount : CARDINAL;
LineStart : INTEGER;
END;
PROCEDURE GetToken (): INTEGER;
VAR
yyState : yyStateRange;
yyTablePtr : yyCombTypePtr;
yyRestartFlag : BOOLEAN;
yyi, yySource, yyTarget, yyChBufferFree : INTEGER;
(* line 130 "cg.rex" *)
VAR
String, Word, TargetCode: tString;
Argument : ARRAY [0..255] OF CHAR;
j : SHORTCARD;
ch : CHAR;
BEGIN
LOOP
yyState := yyStartState;
TokenLength := 0;
(* ASSERT yyChBuffer [yyChBufferIndex] = first character *)
LOOP (* eventually restart after sentinel *)
LOOP (* execute as many state transitions as possible *)
(* determine next state *)
yyTablePtr := yyCombTypePtr (yyBasePtr [yyState] +
ORD (yyChBufferPtr^ [yyChBufferIndex]) * SYSTEM.TSIZE (yyCombType));
IF yyTablePtr^.Check # yyState THEN
yyState := yyDefault [yyState];
IF yyState = yyDNoState THEN EXIT; END;
ELSE
yyState := yyTablePtr^.Next;
INC (TokenLength);
yyStateStack^ [TokenLength] := yyState; (* push state *)
INC (yyChBufferIndex); (* get next character *)
END;
END;
LOOP (* search for last final state *)
CASE yyStateStack^ [TokenLength] OF
|292
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 190 "cg.rex" *)
IF NestingLevel = 0 THEN
MakeText (Attribute.Text);
AssignEmpty (TargetCode);
Position := Attribute.Position;
ELSE
GetWord (Word);
Concatenate (TargetCode, Word);
END;
INC (NestingLevel);
yyRestartFlag := FALSE; EXIT;
|291
:
(* line 202 "cg.rex" *)
DEC (NestingLevel);
IF NestingLevel = 0 THEN
yyStart (STD);
Append (Attribute.Text, TargetCode);
Attribute.Position := Position;
RETURN TokTargetCode;
ELSE
GetWord (Word);
Concatenate (TargetCode, Word);
END;
yyRestartFlag := FALSE; EXIT;
|24
,101
:
(* line 215 "cg.rex" *)
IF NestingLevel > 0 THEN
GetWord (Word);
Concatenate (TargetCode, Word);
END;
yyRestartFlag := FALSE; EXIT;
|290
:
(* line 222 "cg.rex" *)
IF NestingLevel > 0 THEN
Strings.Append (TargetCode, 11C);
END;
yyTab;
yyRestartFlag := FALSE; EXIT;
|289
:
(* line 229 "cg.rex" *)
IF NestingLevel > 0 THEN
Append (Attribute.Text, TargetCode);
AssignEmpty (TargetCode);
END;
yyEol (0);
yyRestartFlag := FALSE; EXIT;
|25
:
(* line 237 "cg.rex" *)
IF NestingLevel > 0 THEN
GetWord (Word);
Strings.Append (TargetCode, Char (Word, 2));
END;
yyRestartFlag := FALSE; EXIT;
|44
:
(* line 244 "cg.rex" *)
IF NestingLevel > 0 THEN
Strings.Append (TargetCode, '\');
END;
yyRestartFlag := FALSE; EXIT;
|288
:
(* line 250 "cg.rex" *)
yyStart (comment);
yyRestartFlag := FALSE; EXIT;
|286
:
(* line 251 "cg.rex" *)
yyPrevious;
yyRestartFlag := FALSE; EXIT;
|30
,50
,96
:
(* line 252 "cg.rex" *)
yyRestartFlag := FALSE; EXIT;
|32
:
(* line 254 "cg.rex" *)
yyRestartFlag := FALSE; EXIT;
|31
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 256 "cg.rex" *)
GetWord (Word);
Attribute.Integer := StringToInt (Word);
RETURN TokInteger;
yyRestartFlag := FALSE; EXIT;
|285
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 260 "cg.rex" *)
GetWord (String);
IF IsElement (ORD ('c'), Options)
THEN yyStart (CStr1);
ELSE yyStart (Str1);
END;
yyRestartFlag := FALSE; EXIT;
|284
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 266 "cg.rex" *)
GetWord (String);
IF IsElement (ORD ('c'), Options)
THEN yyStart (CStr2);
ELSE yyStart (Str2);
END;
yyRestartFlag := FALSE; EXIT;
|29
,97
:
(* line 275 "cg.rex" *)
GetWord (Word); Concatenate (String, Word);
yyRestartFlag := FALSE; EXIT;
|28
,98
:
(* line 275 "cg.rex" *)
GetWord (Word); Concatenate (String, Word);
yyRestartFlag := FALSE; EXIT;
|27
,49
,71
,99
:
(* line 275 "cg.rex" *)
GetWord (Word); Concatenate (String, Word);
yyRestartFlag := FALSE; EXIT;
|26
,48
,70
,100
:
(* line 275 "cg.rex" *)
GetWord (Word); Concatenate (String, Word);
yyRestartFlag := FALSE; EXIT;
|283
:
(* line 278 "cg.rex" *)
GetWord (Word); Concatenate (String, Word); yyEol (0);
yyRestartFlag := FALSE; EXIT;
|282
:
(* line 278 "cg.rex" *)
GetWord (Word); Concatenate (String, Word); yyEol (0);
yyRestartFlag := FALSE; EXIT;
|281
:
(* line 281 "cg.rex" *)
Strings.Append (String, Char (String, 1));
yyPrevious;
IF yyStartState = targetcode THEN
Concatenate (TargetCode, String);
ELSE
Attribute.StringRef := PutString (String);
RETURN TokString;
END;
yyRestartFlag := FALSE; EXIT;
|280
:
(* line 281 "cg.rex" *)
Strings.Append (String, Char (String, 1));
yyPrevious;
IF yyStartState = targetcode THEN
Concatenate (TargetCode, String);
ELSE
Attribute.StringRef := PutString (String);
RETURN TokString;
END;
yyRestartFlag := FALSE; EXIT;
|279
:
(* line 290 "cg.rex" *)
Strings.Append (String, 11C); yyTab;
yyRestartFlag := FALSE; EXIT;
|278
:
(* line 292 "cg.rex" *)
Errors.Message ("unclosed string", Errors.Error, Attribute.Position);
INC (ErrorCount);
Strings.Append (String, Char (String, 1));
yyEol (0); yyPrevious;
IF yyStartState = targetcode THEN
Concatenate (TargetCode, String);
ELSE
Attribute.StringRef := PutString (String);
RETURN TokString;
END;
yyRestartFlag := FALSE; EXIT;
|277
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 304 "cg.rex" *)
RETURN TokLParent ;
yyRestartFlag := FALSE; EXIT;
|276
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 305 "cg.rex" *)
RETURN TokRParent ;
yyRestartFlag := FALSE; EXIT;
|275
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 306 "cg.rex" *)
RETURN TokComma ;
yyRestartFlag := FALSE; EXIT;
|274
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 307 "cg.rex" *)
RETURN TokRArrow ;
yyRestartFlag := FALSE; EXIT;
|272
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 308 "cg.rex" *)
RETURN TokDot ;
yyRestartFlag := FALSE; EXIT;
|241
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 309 "cg.rex" *)
RETURN TokColon ;
yyRestartFlag := FALSE; EXIT;
|270
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 310 "cg.rex" *)
RETURN TokLAngle ;
yyRestartFlag := FALSE; EXIT;
|271
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 311 "cg.rex" *)
RETURN TokLArrow ;
yyRestartFlag := FALSE; EXIT;
|269
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 312 "cg.rex" *)
RETURN TokEqual ;
yyRestartFlag := FALSE; EXIT;
|268
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 313 "cg.rex" *)
RETURN TokRAngle ;
yyRestartFlag := FALSE; EXIT;
|267
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 314 "cg.rex" *)
RETURN TokLBracket ;
yyRestartFlag := FALSE; EXIT;
|266
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 315 "cg.rex" *)
RETURN TokRBracket ;
yyRestartFlag := FALSE; EXIT;
|265
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 316 "cg.rex" *)
yyStart (expr); INC (NestingLevel); RETURN TokLBrace;
yyRestartFlag := FALSE; EXIT;
|264
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 318 "cg.rex" *)
RETURN TokAfter ;
yyRestartFlag := FALSE; EXIT;
|259
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 319 "cg.rex" *)
RETURN TokBefore ;
yyRestartFlag := FALSE; EXIT;
|253
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 320 "cg.rex" *)
RETURN TokCheck ;
yyRestartFlag := FALSE; EXIT;
|248
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 321 "cg.rex" *)
RETURN TokRemote ;
yyRestartFlag := FALSE; EXIT;
|18
,43
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 323 "cg.rex" *)
GetWord (Word);
Attribute.StringRef := PutString (Word);
RETURN TokCode;
yyRestartFlag := FALSE; EXIT;
|242
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 327 "cg.rex" *)
IF NestingLevel <= 1 THEN
RETURN TokAssign;
ELSE
GetWord (Word);
Attribute.StringRef := PutString (Word);
RETURN TokCode;
END;
yyRestartFlag := FALSE; EXIT;
|240
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 335 "cg.rex" *)
IF NestingLevel <= 1 THEN
RETURN TokCopy;
ELSE
GetWord (Word);
Attribute.StringRef := PutString (Word);
RETURN TokCode;
END;
yyRestartFlag := FALSE; EXIT;
|239
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 343 "cg.rex" *)
IF NestingLevel <= 1 THEN
RETURN TokSemiColon;
ELSE
GetWord (Word);
Attribute.StringRef := PutString (Word);
RETURN TokCode;
END;
yyRestartFlag := FALSE; EXIT;
|238
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 351 "cg.rex" *)
GetWord (Word);
Attribute.StringRef := PutString (Word);
RETURN TokColon;
yyRestartFlag := FALSE; EXIT;
|23
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 355 "cg.rex" *)
RETURN TokArrow;
yyRestartFlag := FALSE; EXIT;
|237
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 357 "cg.rex" *)
INC (NestingLevel);
IF NestingLevel <= 2 THEN
RETURN TokLBrace;
ELSE
GetWord (Word);
Attribute.StringRef := PutString (Word);
RETURN TokCode;
END;
yyRestartFlag := FALSE; EXIT;
|236
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 366 "cg.rex" *)
DEC (NestingLevel);
IF NestingLevel = 0 THEN yyStart (STD); END;
IF NestingLevel <= 1 THEN
RETURN TokRBrace;
ELSE
GetWord (Word);
Attribute.StringRef := PutString (Word);
RETURN TokCode;
END;
yyRestartFlag := FALSE; EXIT;
|235
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 376 "cg.rex" *)
GetWord (Word);
Attribute.StringRef := PutString (Word);
RETURN TokCode ;
yyRestartFlag := FALSE; EXIT;
|45
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 380 "cg.rex" *)
GetWord (Word);
Attribute.StringRef := PutString (Word);
RETURN TokCode ;
yyRestartFlag := FALSE; EXIT;
|19
,102
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 384 "cg.rex" *)
GetWord (Word);
Attribute.StringRef := PutString (Word);
RETURN TokWhiteSpace ;
yyRestartFlag := FALSE; EXIT;
|234
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 388 "cg.rex" *)
GetWord (Word);
Attribute.StringRef := PutString (Word);
yyEol (0);
RETURN TokWhiteSpace ;
yyRestartFlag := FALSE; EXIT;
|233
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 393 "cg.rex" *)
GetWord (Word);
Attribute.StringRef := PutString (Word);
yyTab;
RETURN TokWhiteSpace ;
yyRestartFlag := FALSE; EXIT;
|21
,47
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 398 "cg.rex" *)
GetWord (Word);
SubString (Word, 2, 2, String);
Attribute.StringRef := PutString (String);
RETURN TokCode ;
yyRestartFlag := FALSE; EXIT;
|22
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 403 "cg.rex" *)
GetWord (Word);
SubString (Word, 2, Length (Word), String);
Attribute.StringRef := PutString (String);
RETURN TokCode ;
yyRestartFlag := FALSE; EXIT;
|46
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 408 "cg.rex" *)
GetWord (Word);
Attribute.StringRef := PutString (Word);
RETURN TokCode ;
yyRestartFlag := FALSE; EXIT;
|232
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 412 "cg.rex" *)
yyStart (targetcode); RETURN TokBegin ;
yyRestartFlag := FALSE; EXIT;
|227
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 413 "cg.rex" *)
yyStart (targetcode); RETURN TokClose ;
yyRestartFlag := FALSE; EXIT;
|222
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 414 "cg.rex" *)
RETURN TokDeclare ;
yyRestartFlag := FALSE; EXIT;
|217
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 415 "cg.rex" *)
RETURN TokDemand ;
yyRestartFlag := FALSE; EXIT;
|211
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 416 "cg.rex" *)
RETURN TokEnd ;
yyRestartFlag := FALSE; EXIT;
|209
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 417 "cg.rex" *)
RETURN TokEval ;
yyRestartFlag := FALSE; EXIT;
|206
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 418 "cg.rex" *)
yyStart (targetcode); RETURN TokExport ;
yyRestartFlag := FALSE; EXIT;
|200
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 419 "cg.rex" *)
RETURN TokFor ;
yyRestartFlag := FALSE; EXIT;
|198
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 420 "cg.rex" *)
RETURN TokFunction ;
yyRestartFlag := FALSE; EXIT;
|190
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 421 "cg.rex" *)
yyStart (targetcode); RETURN TokGlobal ;
yyRestartFlag := FALSE; EXIT;
|184
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 422 "cg.rex" *)
RETURN TokIgnore ;
yyRestartFlag := FALSE; EXIT;
|179
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 423 "cg.rex" *)
yyStart (targetcode); RETURN TokImport ;
yyRestartFlag := FALSE; EXIT;
|38
,51
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 424 "cg.rex" *)
RETURN TokInput ;
yyRestartFlag := FALSE; EXIT;
|39
,87
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 425 "cg.rex" *)
RETURN TokInherited ;
yyRestartFlag := FALSE; EXIT;
|174
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 426 "cg.rex" *)
RETURN TokLeft ;
yyRestartFlag := FALSE; EXIT;
|171
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 427 "cg.rex" *)
yyStart (targetcode); RETURN TokLocal ;
yyRestartFlag := FALSE; EXIT;
|166
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 428 "cg.rex" *)
RETURN TokModule ;
yyRestartFlag := FALSE; EXIT;
|160
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 429 "cg.rex" *)
RETURN TokNone ;
yyRestartFlag := FALSE; EXIT;
|37
,72
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 430 "cg.rex" *)
RETURN TokOutput ;
yyRestartFlag := FALSE; EXIT;
|156
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 431 "cg.rex" *)
RETURN TokParser ;
yyRestartFlag := FALSE; EXIT;
|151
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 432 "cg.rex" *)
RETURN TokPrec ;
yyRestartFlag := FALSE; EXIT;
|149
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 433 "cg.rex" *)
RETURN TokProperty ;
yyRestartFlag := FALSE; EXIT;
|36
,86
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 434 "cg.rex" *)
RETURN TokReverse ;
yyRestartFlag := FALSE; EXIT;
|141
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 435 "cg.rex" *)
RETURN TokRight ;
yyRestartFlag := FALSE; EXIT;
|137
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 436 "cg.rex" *)
RETURN TokRule ;
yyRestartFlag := FALSE; EXIT;
|134
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 437 "cg.rex" *)
RETURN TokScanner ;
yyRestartFlag := FALSE; EXIT;
|128
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 438 "cg.rex" *)
RETURN TokSelect ;
yyRestartFlag := FALSE; EXIT;
|123
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 439 "cg.rex" *)
RETURN TokStack ;
yyRestartFlag := FALSE; EXIT;
|119
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 440 "cg.rex" *)
RETURN TokSubunit ;
yyRestartFlag := FALSE; EXIT;
|35
,85
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 441 "cg.rex" *)
RETURN TokSynthesized ;
yyRestartFlag := FALSE; EXIT;
|113
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 442 "cg.rex" *)
RETURN TokThread ;
yyRestartFlag := FALSE; EXIT;
|108
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 443 "cg.rex" *)
RETURN TokTree ;
yyRestartFlag := FALSE; EXIT;
|104
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 444 "cg.rex" *)
RETURN TokView ;
yyRestartFlag := FALSE; EXIT;
|34
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 445 "cg.rex" *)
RETURN TokVirtual ;
yyRestartFlag := FALSE; EXIT;
|17
,40
,41
,42
,52
,53
,54
,55
,56
,57
,58
,59
,60
,61
,62
,63
,64
,65
,66
,67
,68
,73
,74
,75
,76
,77
,78
,79
,80
,81
,82
,83
,84
,88
,89
,103
,105
,106
,107
,109
,110
,111
,112
,114
,115
,116
,117
,118
,120
,121
,122
,124
,125
,126
,127
,129
,130
,131
,132
,133
,135
,136
,138
,139
,140
,142
,143
,144
,145
,146
,147
,148
,150
,152
,153
,154
,155
,157
,158
,159
,161
,162
,163
,164
,165
,167
,168
,169
,170
,172
,173
,175
,176
,177
,178
,180
,181
,182
,183
,185
,186
,187
,188
,189
,191
,192
,193
,194
,195
,196
,197
,199
,201
,202
,203
,204
,205
,207
,208
,210
,212
,213
,214
,215
,216
,218
,219
,220
,221
,223
,224
,225
,226
,228
,229
,230
,231
,243
,244
,245
,246
,247
,249
,250
,251
,252
,254
,255
,256
,257
,258
,260
,261
,262
,263
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 447 "cg.rex" *)
GetWord (Word);
Attribute.Ident := MakeIdent (Word);
RETURN TokIdentifier;
yyRestartFlag := FALSE; EXIT;
|33
:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart - TokenLength;
(* line 451 "cg.rex" *)
GetWord (Word);
SubString (Word, 2, Length (Word), String);
Attribute.Ident := MakeIdent (String);
RETURN TokIdentifier;
yyRestartFlag := FALSE; EXIT;
|95
:
(* BlankAction *)
WHILE yyChBufferPtr^ [yyChBufferIndex] = ' ' DO INC (yyChBufferIndex); END;
yyRestartFlag := FALSE; EXIT;
|94
:
(* TabAction *)
DEC (yyLineStart, 7 - (yyChBufferIndex - yyLineStart - 2) MOD 8);
yyRestartFlag := FALSE; EXIT;
|93
:
(* EolAction *)
INC (yyLineCount);
yyLineStart := yyChBufferIndex - 1;
yyRestartFlag := FALSE; EXIT;
|1
,2
,3
,4
,5
,6
,7
,8
,9
,10
,11
,12
,13
,14
,15
,16
,20
,69
,90
,273
,287
:
(* non final states *)
DEC (yyChBufferIndex); (* return character *)
DEC (TokenLength) (* pop state *)
| 92:
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart;
INC (yyChBufferIndex);
TokenLength := 1;
(* line 140 "cg.rex" *)
GetWord (Word);
Errors.MessageI ("illegal character", Errors.Error, Attribute.Position, Errors.String, ADR (Word));
INC (ErrorCount);
yyRestartFlag := FALSE; EXIT;
| yyDNoState : (* automatic initialization *)
yyGetTables;
yyStateStack^ [0] := yyDefaultState; (* stack underflow sentinel *)
IF yyFileStackPtr = 0 THEN
yyInitialize;
yySourceFile := System.StdInput;
END;
yyRestartFlag := FALSE; EXIT;
| 91:
DEC (yyChBufferIndex); (* undo last state transition *)
DEC (TokenLength); (* get previous state *)
IF TokenLength = 0 THEN
yyState := yyStartState;
ELSE
yyState := yyStateStack^ [TokenLength];
END;
IF yyChBufferIndex # yyChBufferStart + yyBytesRead THEN
yyState := yyEobTrans [yyState]; (* end of buffer sentinel in buffer *)
IF yyState # yyDNoState THEN
INC (yyChBufferIndex);
INC (TokenLength);
yyStateStack^ [TokenLength] := yyState;
yyRestartFlag := TRUE; EXIT;
END;
ELSE (* end of buffer reached *)
(* copy initial part of token in front of input buffer *)
yySource := yyChBufferIndex - TokenLength - 1;
yyTarget := General.MaxAlign - TokenLength MOD General.MaxAlign - 1;
IF yySource # yyTarget THEN
FOR yyi := 1 TO TokenLength DO
yyChBufferPtr^ [yyTarget + yyi] := yyChBufferPtr^ [yySource + yyi];
END;
DEC (yyLineStart, yySource - yyTarget);
yyChBufferStart := yyTarget + TokenLength + 1;
ELSE
yyChBufferStart := yyChBufferIndex;
END;
IF NOT yyEof THEN (* read buffer and restart *)
yyChBufferFree := General.Exp2 (General.Log2 (yyChBufferSize - 4 - General.MaxAlign - TokenLength));
IF yyChBufferFree < yyChBufferSize DIV 8 THEN
DynArray.ExtendArray (yyChBufferPtr, yyChBufferSize, SYSTEM.TSIZE (CHAR));
IF yyChBufferPtr = NIL THEN yyErrorMessage (1); END;
yyChBufferFree := General.Exp2 (General.Log2 (yyChBufferSize - 4 - General.MaxAlign - TokenLength));
IF yyStateStackSize < yyChBufferSize THEN
DynArray.ExtendArray (yyStateStack, yyStateStackSize, SYSTEM.TSIZE (yyStateRange));
IF yyStateStack = NIL THEN yyErrorMessage (1); END;
END;
END;
yyChBufferIndex := yyChBufferStart;
yyBytesRead := Source.GetLine (yySourceFile, SYSTEM.ADR
(yyChBufferPtr^ [yyChBufferIndex]), yyChBufferFree);
IF yyBytesRead <= 0 THEN yyBytesRead := 0; yyEof := TRUE; END;
yyChBufferPtr^ [yyChBufferStart + yyBytesRead ] := yyEobCh;
yyChBufferPtr^ [yyChBufferStart + yyBytesRead + 1] := 0C;
yyRestartFlag := TRUE; EXIT;
END;
IF TokenLength = 0 THEN (* end of file reached *)
Attribute.Position.Line := yyLineCount;
Attribute.Position.Column := yyChBufferIndex - yyLineStart;
CloseFile;
IF yyFileStackPtr = 0 THEN
(* line 146 "cg.rex" *)
CASE yyStartState OF
| targetcode ,
expr : Errors.Message ("unclosed target code", Errors.Error, Attribute.Position);
INC (ErrorCount);
| comment : Errors.Message ("unclosed comment", Errors.Error, Attribute.Position);
INC (ErrorCount);
| CStr1, CStr2,
Str1, Str2 : Errors.Message ("unclosed string", Errors.Error, Attribute.Position);
INC (ErrorCount);
ELSE
END;
yyStart (STD);
INC (CurArg);
IF CurArg <= ArgCount THEN
GetArgument (CurArg, Argument);
j := 0;
REPEAT
ch := Argument [j];
SourceFile [j] := ch;
INC (j);
UNTIL ch = 0C;
BeginFile (SourceFile);
ArrayToString (SourceFile, String);
Attribute.Position.File := MakeIdent (String);
END;
END;
IF yyFileStackPtr = 0 THEN RETURN EofToken; END;
yyRestartFlag := FALSE; EXIT;
END;
END;
ELSE
yyErrorMessage (0);
END;
END;
IF yyRestartFlag THEN ELSE EXIT; END;
END;
END;
END GetToken;
PROCEDURE BeginFile (FileName: ARRAY OF CHAR);
BEGIN
IF yyStateStack^ [0] = yyDNoState THEN (* have tables been read in ? *)
yyGetTables;
yyStateStack^ [0] := yyDefaultState; (* stack underflow sentinel *)
END;
yyInitialize;
yySourceFile := Source.BeginSource (FileName);
IF yySourceFile < 0 THEN yyErrorMessage (5); END;
END BeginFile;
PROCEDURE yyInitialize;
BEGIN
IF yyFileStackPtr >= yyFileStackSize THEN yyErrorMessage (3); END;
INC (yyFileStackPtr); (* push file *)
WITH yyFileStack [yyFileStackPtr] DO
SourceFile := yySourceFile ;
Eof := yyEof ;
ChBufferPtr := yyChBufferPtr ;
ChBufferStart := yyChBufferStart ;
ChBufferSize := yyChBufferSize ;
ChBufferIndex := yyChBufferIndex ;
BytesRead := yyBytesRead ;
LineCount := yyLineCount ;
LineStart := yyLineStart ;
END;
(* initialize file state *)
yyChBufferSize := yyInitBufferSize;
DynArray.MakeArray (yyChBufferPtr, yyChBufferSize, SYSTEM.TSIZE (CHAR));
IF yyChBufferPtr = NIL THEN yyErrorMessage (1); END;
yyChBufferStart := General.MaxAlign;
yyChBufferPtr^ [yyChBufferStart - 1] := yyEolCh; (* begin of line indicator *)
yyChBufferPtr^ [yyChBufferStart ] := yyEobCh; (* end of buffer sentinel *)
yyChBufferPtr^ [yyChBufferStart + 1] := 0C;
yyChBufferIndex := yyChBufferStart;
yyEof := FALSE;
yyBytesRead := 0;
yyLineCount := 1;
yyLineStart := yyChBufferStart - 1;
END yyInitialize;
PROCEDURE CloseFile;
BEGIN
IF yyFileStackPtr = 0 THEN yyErrorMessage (4); END;
Source.CloseSource (yySourceFile);
DynArray.ReleaseArray (yyChBufferPtr, yyChBufferSize, SYSTEM.TSIZE (CHAR));
WITH yyFileStack [yyFileStackPtr] DO (* pop file *)
yySourceFile := SourceFile ;
yyEof := Eof ;
yyChBufferPtr := ChBufferPtr ;
yyChBufferStart:= ChBufferStart ;
yyChBufferSize := ChBufferSize ;
yyChBufferIndex:= ChBufferIndex ;
yyBytesRead := BytesRead ;
yyLineCount := LineCount ;
yyLineStart := LineStart ;
END;
DEC (yyFileStackPtr);
END CloseFile;
PROCEDURE GetWord (VAR Word: Strings.tString);
VAR i, WordStart : INTEGER;
BEGIN
WordStart := yyChBufferIndex - TokenLength - 1;
FOR i := 1 TO TokenLength DO
Word.Chars [i] := yyChBufferPtr^ [WordStart + i];
END;
Word.Length := TokenLength;
END GetWord;
PROCEDURE GetLower (VAR Word: Strings.tString);
VAR i, WordStart : INTEGER;
BEGIN
WordStart := yyChBufferIndex - TokenLength - 1;
FOR i := 1 TO TokenLength DO
Word.Chars [i] := yyToLower [yyChBufferPtr^ [WordStart + i]];
END;
Word.Length := TokenLength;
END GetLower;
PROCEDURE GetUpper (VAR Word: Strings.tString);
VAR i, WordStart : INTEGER;
BEGIN
WordStart := yyChBufferIndex - TokenLength - 1;
FOR i := 1 TO TokenLength DO
Word.Chars [i] := yyToUpper [yyChBufferPtr^ [WordStart + i]];
END;
Word.Length := TokenLength;
END GetUpper;
PROCEDURE yyStart (State: yyStateRange);
BEGIN
yyPreviousStart := yyStartState;
yyStartState := State;
END yyStart;
PROCEDURE yyPrevious;
VAR s : yyStateRange;
BEGIN
s := yyStartState;
yyStartState := yyPreviousStart;
yyPreviousStart := s;
END yyPrevious;
PROCEDURE yyEcho;
VAR i : INTEGER;
BEGIN
FOR i := yyChBufferIndex - TokenLength TO yyChBufferIndex - 1 DO
IO.WriteC (IO.StdOutput, yyChBufferPtr^ [i]);
END;
END yyEcho;
PROCEDURE yyLess (n: INTEGER);
BEGIN
DEC (yyChBufferIndex, TokenLength - n);
TokenLength := n;
END yyLess;
PROCEDURE yyTab;
BEGIN
DEC (yyLineStart, yyTabSpace - 1 - (yyChBufferIndex - yyLineStart - 2) MOD yyTabSpace);
END yyTab;
PROCEDURE yyTab1 (a: INTEGER);
BEGIN
DEC (yyLineStart, yyTabSpace - 1 - (yyChBufferIndex - yyLineStart - TokenLength + a - 1) MOD yyTabSpace);
END yyTab1;
PROCEDURE yyTab2 (a, b: INTEGER);
BEGIN
DEC (yyLineStart, yyTabSpace - 1 - (yyChBufferIndex - yyLineStart - TokenLength + a - 1) MOD yyTabSpace);
END yyTab2;
PROCEDURE yyEol (Column: INTEGER);
BEGIN
INC (yyLineCount);
yyLineStart := yyChBufferIndex - 1 - Column;
END yyEol;
PROCEDURE output (c: CHAR);
BEGIN
IO.WriteC (IO.StdOutput, c);
END output;
PROCEDURE unput (c: CHAR);
BEGIN
DEC (yyChBufferIndex);
yyChBufferPtr^ [yyChBufferIndex] := c;
END unput;
PROCEDURE input (): CHAR;
BEGIN
IF yyChBufferIndex = yyChBufferStart + yyBytesRead THEN
IF NOT yyEof THEN
DEC (yyLineStart, yyBytesRead);
yyChBufferIndex := 0;
yyChBufferStart := 0;
yyBytesRead := Source.GetLine (yySourceFile, yyChBufferPtr, General.Exp2 (General.Log2 (yyChBufferSize)));
IF yyBytesRead <= 0 THEN yyBytesRead := 0; yyEof := TRUE; END;
yyChBufferPtr^ [yyBytesRead ] := yyEobCh;
yyChBufferPtr^ [yyBytesRead + 1] := 0C;
END;
END;
IF yyChBufferIndex = yyChBufferStart + yyBytesRead THEN
RETURN 0C;
ELSE
INC (yyChBufferIndex);
RETURN yyChBufferPtr^ [yyChBufferIndex - 1];
END
END input;
PROCEDURE BeginScanner;
BEGIN
(* line 138 "cg.rex" *)
NestingLevel := 0;
END BeginScanner;
PROCEDURE CloseScanner;
BEGIN
END CloseScanner;
PROCEDURE yyGetTables;
VAR
BlockSize, j, n : CARDINAL;
TableFile : System.tFile;
i : yyStateRange;
Base : ARRAY yyStateRange OF yyTableRange;
BEGIN
BlockSize := 64000 DIV SYSTEM.TSIZE (yyCombType);
TableFile := System.OpenInput (ScanTabName);
Checks.ErrorCheck ("yyGetTables.OpenInput", TableFile);
IF (yyGetTable (TableFile, SYSTEM.ADR (Base )) DIV SYSTEM.TSIZE (yyTableElmt) - 1 # yyDStateCount) OR
(yyGetTable (TableFile, SYSTEM.ADR (yyDefault )) DIV SYSTEM.TSIZE (yyTableElmt) - 1 # yyDStateCount) OR
(yyGetTable (TableFile, SYSTEM.ADR (yyEobTrans)) DIV SYSTEM.TSIZE (yyTableElmt) - 1 # yyDStateCount)
THEN
yyErrorMessage (2);
END;
n := 0;
j := 0;
WHILE j <= yyTableSize DO
INC (n, yyGetTable (TableFile, SYSTEM.ADR (yyComb [j])) DIV SYSTEM.TSIZE (yyCombType));
INC (j, BlockSize);
END;
IF n # yyTableSize + 1 THEN yyErrorMessage (2); END;
System.Close (TableFile);
FOR i := 0 TO yyDStateCount DO
yyBasePtr [i] := LONGCARD (SYSTEM.ADR (yyComb [Base [i]]));
END;
END yyGetTables;
PROCEDURE yyGetTable (TableFile: System.tFile; Address: SYSTEM.ADDRESS): CARDINAL;
VAR
N : INTEGER;
Length : yyTableElmt;
BEGIN
N := System.Read (TableFile, SYSTEM.ADR (Length), SYSTEM.TSIZE (yyTableElmt));
Checks.ErrorCheck ("yyGetTable.Read1", N);
N := System.Read (TableFile, Address, Length);
Checks.ErrorCheck ("yyGetTable.Read2", N);
RETURN Length;
END yyGetTable;
PROCEDURE yyErrorMessage (ErrorCode: SHORTCARD);
BEGIN
Positions.WritePosition (IO.StdError, Attribute.Position);
CASE ErrorCode OF
| 0: IO.WriteS (IO.StdError, ": Scanner: internal error");
| 1: IO.WriteS (IO.StdError, ": Scanner: out of memory");
| 2: IO.WriteS (IO.StdError, ": Scanner: table mismatch");
| 3: IO.WriteS (IO.StdError, ": Scanner: too many nested include files");
| 4: IO.WriteS (IO.StdError, ": Scanner: file stack underflow (too many calls of CloseFile)");
| 5: IO.WriteS (IO.StdError, ": Scanner: cannot open input file");
END;
IO.WriteNl (IO.StdError); Exit;
END yyErrorMessage;
PROCEDURE yyExit;
BEGIN
IO.CloseIO; System.Exit (1);
END yyExit;
BEGIN
ScanTabName := "Scanner.Tab";
Exit := yyExit;
yyFileStackPtr := 0;
yyStartState := 1; (* set up for auto init *)
yyPreviousStart := 1;
yyBasePtr [yyStartState] := LONGCARD (SYSTEM.ADR (yyComb [0]));
yyDefault [yyStartState] := yyDNoState;
yyComb [0].Check := yyDNoState;
yyChBufferPtr := SYSTEM.ADR (yyComb [0]); (* dirty trick *)
yyChBufferIndex := 1; (* dirty trick *)
yyStateStackSize := yyInitBufferSize;
DynArray.MakeArray (yyStateStack, yyStateStackSize, SYSTEM.TSIZE (yyStateRange));
yyStateStack^ [0] := yyDNoState;
FOR yyCh := yyFirstCh TO yyLastCh DO yyToLower [yyCh] := yyCh; END;
yyToUpper := yyToLower;
FOR yyCh := 'A' TO 'Z' DO
yyToLower [yyCh] := CHR (ORD (yyCh) - ORD ('A') + ORD ('a'));
END;
FOR yyCh := 'a' TO 'z' DO
yyToUpper [yyCh] := CHR (ORD (yyCh) - ORD ('a') + ORD ('A'));
END;
END Scanner.